/*
 * @Description: 
 * @Author: HKH
 * @Date: 2024-10-11 19:03:57
 * @LastEditors: HKH
 * @LastEditTime: 2024-10-11 19:04:18
 */
public class ITicketRunnable implements Runnable {
    // 总票数 50
    private int num = 50;
    // 创建锁对象给同步代码块使用
    Object mutex = new Object();
  
    @Override
    public void run() {
      while (true) {
        synchronized (mutex) {
          // 1. 线程抢占资源 ，上锁，进入代码块执行
          // 2. 另外两个线程抢不到资源，进入阻塞状态
          // 3. 第一步的线程执行结束，释放资源，解锁
          // 4. 三个线程抢占资源，重新上锁
          // 反复执行
          // 需要同步的内容 - 开始
          if (num <= 0) {
            break;
          }
          String name = Thread.currentThread().getName();
          System.out.println(name + "正在卖票，第" + num + "张票。");
          // 每隔50ms销售一张票
          num--;
          try {
            Thread.sleep(50);
          } catch (Exception e) {
            e.printStackTrace();
          }
          // 线程执行完同步的代码后，会自动释放锁 - 解锁
          // 需要同步的内容 - 结束
          // 或者 break return 也会离开代码块
        }
      }
    }
  }